#ifndef CONTROL_COMMAND_H
#define CONTROL_COMMAND_H

#include <string>
#include <vector>
#include <variant>  // 替代 union，支持 std::string 等非平凡类型
#include <cstdint>  // 用于固定大小整数类型（如 uint8_t）

/**
 * @brief 控制参数结构体（存储单条控制指令的参数）
 * 用 std::variant 替代 union，解决“默认构造/析构被删除”问题
 */
struct ControlParam {
    // 参数类型枚举：标识当前 value 存储的数据类型
    enum class Type : uint8_t {
        INT = 0x01,     // 整型参数
        DOUBLE = 0x02,  // 浮点型参数
        STRING = 0x03   // 字符串参数
    };

    Type type;  // 当前参数的数据类型
    // 存储参数值：支持 int/double/std::string 三种类型
    std::variant<int32_t, double, std::string> value;
};

/**
 * @brief 控制指令结构体（机器人控制的完整指令）
 * 包含指令类型、参数列表、时间戳等信息（可根据项目实际逻辑调整）
 */
struct ControlCommand {
    // 指令类型枚举（可根据项目扩展，如运动指令、停止指令、配置指令等）
    enum class CommandType : uint8_t {
        MOVE_TO_POS = 0x10,    // 移动到目标位置
        STOP_MOTION = 0x20,    // 停止运动
        SET_SPEED = 0x30,      // 设置运动速度
        GET_STATE = 0x40,      // 获取机器人状态
        RESET_FAULT = 0x50     // 重置故障
    };

    CommandType cmd_type;        // 指令类型
    std::vector<ControlParam> params;  // 指令参数列表（支持多个参数）
    uint32_t seq_num;            // 指令序列号（用于防丢包/重发）
    qint64 timestamp;            // 指令时间戳（毫秒级）
    bool need_ack = true;        // 是否需要指令确认（true=需要回复，false=无需回复）
};

#endif // CONTROL_COMMAND_H